#ifndef __SCREENS_H__
#define __SCREENS_H__

#include "display_dev.h"
#include "display_buffer.h"
#include <drmrga.h>
using namespace std;

class screens
{
    public:
        screens(display_buffer *dev,uint32_t width ,uint32_t height,uint32_t vrefresh);
        void *display_getImgAddr(uint32_t format,uint32_t index);
        int display_img(uint32_t position_x ,uint32_t position_y,
                                uint32_t width ,uint32_t height ,
                                uint32_t format,int fd,uint32_t BufferIndex = 0);
        int display_img(void *addr,uint32_t length,int fd ,uint32_t format ,
                                uint32_t width ,uint32_t height ,
                                uint32_t position_x ,uint32_t position_y);
        void drow_background(string path,uint32_t format);
        ~screens();

    private :


        
        void init_screens(const uint32_t width ,const  uint32_t height,const  uint32_t vrefresh,
                                            display_dev::sp_crtc    *p_crtc,               //--当前使用的crtc;
                                            drmModeEncoderPtr  *p_current_encoder,      //--当前使用的encoder;
                                            drmModeConnectorPtr  *p_current_connector//--当前连接器
                                                );
       


       typedef int(* FUNC_RGA_INIT)();
        typedef void(* FUNC_RGA_DEINIT)();

        typedef int (*FUNC_GetAllocBuffer)(bo_t *bo_info, int width, int height, int bpp);    //--申请空间
        typedef  int (*FUNC_GetMmap)(bo_t *bo_info);                                                         //--映射空间
        typedef  int (*FUNC_GetBufferFd)(bo_t *bo_info, int *fd);                                          //--拿到文件描述符供DRM用
        typedef  int (*FUNC_Unmap)(bo_t *bo_info);                                                              //--反映射空间
        typedef  int (*FUNC_Free)(bo_t *bo_info);                                                                   //--释放空间

        typedef int(* FUNC_RGA_BLIT)(rga_info_t *, rga_info_t *, rga_info_t *);                       //--裁剪，格式转换，缩放，拼接等操作
        typedef struct _rga_context{
            void *rga_handle;
            FUNC_RGA_INIT init_func;
            FUNC_RGA_DEINIT deinit_func;

            FUNC_GetAllocBuffer alloc_buffer;
            FUNC_GetMmap          get_mmap;
            FUNC_GetBufferFd        get_bufferFd;
            FUNC_Unmap                unmap;
            FUNC_Free                     free_buffer;

            FUNC_RGA_BLIT               blit_func;
        } rga_context;

        typedef struct 
        {
            uint32_t fb_id;
            uint32_t t_handle;
        }buffer_obj;
        buffer_obj              *m_buffer_obj;
        rga_context             *m_rga_ctx;
        display_buffer          *dev;

        display_dev::sp_bo     *img_bo ;
        bo_t img_rgabo;    //--RGA对象
        int     img_rga_fd;    //--RGA文件描述符

        display_dev::sp_crtc    current_crtc;               //--当前使用的crtc;
        drmModeEncoderPtr  current_encoder;      //--当前使用的encoder;
        drmModeConnectorPtr  current_connector;//--当前连接器
        display_dev::sp_plane NV12_plane;   //--当前使用NV12的图层
        display_dev::sp_plane NV12_plane2;   //--当前使用NV12的图层
        display_dev::sp_plane XRGB_plane;   //--当前使用XRGB8888的图层

        //display_dev::sp_bo                      *tmp_scanout;   // --临时变量

        bo_t rga_bo;    //--RGA对象
        int    rga_fd;    //--RGA文件描述符
        int rga_control_buffer_init(bo_t *bo, int *buf_fd, int width, int height, int bpp);
        void rga_control_buffer_deinit(bo_t *bo, int buf_fd);



        display_dev::sp_plane * get_sp_plane(const display_dev::sp_crtc *crtc,const uint32_t format);
};


#endif